home *** CD-ROM | disk | FTP | other *** search
/ Clickx 47 / Clickx 47.iso / assets / software / Miro_Installer.exe / Miro_Downloader.exe / download_utils.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-01-10  |  5.4 KB  |  215 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from os import access, F_OK
  5. from urlparse import urlparse
  6. import os.path as os
  7. import re
  8. import urllib
  9. import filetypes
  10. import util
  11. from util import checkF, checkU, returnsFilename
  12. from platformutils import unicodeToFilename, unmakeURLSafe
  13. URIPattern = re.compile('^([^?]*/)?([^/?]*)/*(\\?(.*))?$')
  14. MAX_FILENAME_LENGTH = 100
  15. MAX_FILENAME_EXTENSION_LENGTH = 50
  16.  
  17. def fixFileURLS(url):
  18.     """Fix file URLS that start with file:// instead of file:///.  Note: this
  19.     breaks for file URLS that include a hostname, but we never use those and
  20.     it's not so clear what that would mean anyway -- file URLs is an ad-hoc
  21.     spec as I can tell.."""
  22.     if url.startswith('file://'):
  23.         if not url.startswith('file:///'):
  24.             url = 'file:///%s' % url[len('file://'):]
  25.         
  26.         url = url.replace('\\', '/')
  27.     
  28.     return url
  29.  
  30.  
  31. def defaultPort(scheme):
  32.     if scheme == 'https':
  33.         return 443
  34.     elif scheme == 'http':
  35.         return 80
  36.     elif scheme == 'file':
  37.         return None
  38.     elif util.chatter:
  39.         print 'WARNING: Assuming port 80 for scheme: %s' % scheme
  40.     
  41.     return 80
  42.  
  43.  
  44. def parseURL(url, split_path = False):
  45.     url = fixFileURLS(url)
  46.     (scheme, host, path, params, query, fragment) = util.unicodify(list(urlparse(url)))
  47.     if host.count(':') > 1:
  48.         host = host[0:host.rfind(':')]
  49.     
  50.     if scheme == '' and util.chatter:
  51.         print 'WARNING: %r has no scheme' % url
  52.     
  53.     if ':' in host:
  54.         (host, port) = host.split(':')
  55.         
  56.         try:
  57.             port = int(port)
  58.         print 'DTV: parseURL: WARNING: invalid port for %r' % url
  59.         port = defaultPort(scheme)
  60.  
  61.     else:
  62.         port = defaultPort(scheme)
  63.     host = host.lower()
  64.     scheme = scheme.lower()
  65.     path = path.replace('|', ':')
  66.     if path == '' or path[0] != '/':
  67.         path = '/' + path
  68.     elif re.match('/[a-zA-Z]:', path):
  69.         path = path[1:]
  70.     
  71.     fullPath = path
  72.     if split_path:
  73.         return (scheme, host, port, fullPath, params, query)
  74.     elif params:
  75.         fullPath += ';%s' % params
  76.     
  77.     if query:
  78.         fullPath += '?%s' % query
  79.     
  80.     return (scheme, host, port, fullPath)
  81.  
  82.  
  83. def getFileURLPath(url):
  84.     (scheme, host, port, path) = parseURL(url)
  85.     if scheme != 'file':
  86.         raise ValueError('%r is not a file URL' % url)
  87.     
  88.     return unmakeURLSafe(path)
  89.  
  90.  
  91. def checkFilenameExtension(filename, httpInfo):
  92.     checkF(filename)
  93.     if 'content-type' in httpInfo and not filetypes.isAllowedFilename(filename):
  94.         guessedExt = filetypes.guessExtension(httpInfo['content-type'])
  95.         if guessedExt is not None:
  96.             filename += guessedExt
  97.         
  98.     
  99.     return filename
  100.  
  101.  
  102. def nextFreeFilename(name):
  103.     checkF(name)
  104.     if not access(name, F_OK):
  105.         return name
  106.     
  107.     parts = name.split('.')
  108.     count = 1
  109.     if len(parts) == 1:
  110.         newname = '%s.%s' % (name, count)
  111.         while access(newname, F_OK):
  112.             count += 1
  113.             newname = '%s.%s' % (name, count)
  114.     else:
  115.         parts[-1:-1] = [
  116.             str(count)]
  117.         newname = '.'.join(parts)
  118.         while access(newname, F_OK):
  119.             count += 1
  120.             parts[-2] = str(count)
  121.             newname = '.'.join(parts)
  122.     return newname
  123.  
  124. nextFreeFilename = returnsFilename(nextFreeFilename)
  125.  
  126. def filenameFromURL(url, clean = False):
  127.     checkU(url)
  128.     
  129.     try:
  130.         match = URIPattern.match(url)
  131.         if match is None:
  132.             return unicodeToFilename(url)
  133.         
  134.         filename = match.group(2)
  135.         query = match.group(4)
  136.         if not filename:
  137.             ret = query
  138.         elif not query:
  139.             ret = filename
  140.         else:
  141.             (root, ext) = os.path.splitext(filename)
  142.             ret = u'%s-%s%s' % (root, query, ext)
  143.         if ret is None:
  144.             ret = u'unknown'
  145.         
  146.         if clean:
  147.             return cleanFilename(ret)
  148.         else:
  149.             return unicodeToFilename(ret)
  150.     except:
  151.         return unicodeToFilename(u'unknown')
  152.  
  153.  
  154. filenameFromURL = returnsFilename(filenameFromURL)
  155.  
  156. def cleanFilename(filename):
  157.     for char in ':?><|*/\\"\'':
  158.         filename = filename.replace(char, '')
  159.     
  160.     if len(filename) == 0:
  161.         return unicodeToFilename(u'_')
  162.     
  163.     if len(filename) > MAX_FILENAME_LENGTH:
  164.         (base, ext) = os.path.splitext(filename)
  165.         ext = ext[:MAX_FILENAME_EXTENSION_LENGTH]
  166.         base = base[:MAX_FILENAME_LENGTH - len(ext)]
  167.         filename = base + ext
  168.     
  169.     if type(filename) == str:
  170.         return unicodeToFilename(filename.decode('ascii', 'replace'))
  171.     else:
  172.         return unicodeToFilename(filename)
  173.  
  174. cleanFilename = returnsFilename(cleanFilename)
  175.  
  176. def saveData(target, suggested_basename, data):
  177.     
  178.     try:
  179.         os.makedirs(target)
  180.     except:
  181.         pass
  182.  
  183.     filename = os.path.join(target, suggested_basename)
  184.     
  185.     try:
  186.         tmp_filename = filename + '.part'
  187.         tmp_filename = nextFreeFilename(tmp_filename)
  188.         output = file(tmp_filename, 'wb')
  189.         output.write(data)
  190.         output.close()
  191.     except IOError:
  192.         
  193.         try:
  194.             os.remove(tmp_filename)
  195.         except:
  196.             pass
  197.  
  198.         raise 
  199.  
  200.     filename = nextFreeFilename(filename)
  201.     needsSave = True
  202.     
  203.     try:
  204.         os.remove(filename)
  205.     except:
  206.         pass
  207.  
  208.     os.rename(tmp_filename, filename)
  209.     return filename
  210.  
  211.  
  212. def filterDirectoryName(name):
  213.     return re.sub('[^a-zA-Z0-9]', '-', name)
  214.  
  215.